package lp2.projeto.gerenciador;
import java.io.Serializable;
import java.util.*;
/**
 * Classe responsavel por armazena informacoes sobre um contato
 */
public class Contato implements Serializable, Comparable<Contato> {

	private static final long serialVersionUID = -8519272854842163501L;
	private String nome;
	private String endereco;
	private String dataAniversario;
	private List<FormaDeContato> formasDeContato = new ArrayList<FormaDeContato>();
	/**
	 * Construtor da classe Contato.
	 * @param nome Nome do contato	
	 * @param endereco Endereco do contato
	 * @param dataAniversario Data de aniversario do contato
	 * @param formaDeContato Forma de contato do contato
	 */
	public Contato(String nome, String endereco, String dataAniversario, FormaDeContato formaDeContato){
		this.nome = nome;
		this.endereco = endereco;
		this.dataAniversario = dataAniversario;
		addFormaDeContato(formaDeContato);
	}
	/**
	 * Construtor da classe Contato.
	 * @param nome Nome do contato	
	 * @param endereco Endereco do contato
	 * @param dataAniversario Data de aniversario do contato
	 * @param formaDeContato Lista contendo as formas de contato do contato
	 */
	public Contato(String nome, String endereco, String dataAniversario, List<FormaDeContato> formasDeContato){
		this.nome = nome;
		this.endereco = endereco;
		this.dataAniversario = dataAniversario;
		this.formasDeContato = new ArrayList<FormaDeContato>(formasDeContato);
	}
	/**
	 * Get do nome do contato.
	 * @return Nome do contato
	 */
	public String getNome() {
		return nome;
	}
	/**
	 * Get da data de aniversario do contato.
	 * @return Data de aniversario do contato
	 */
	public String getDataAniversario() {
		return dataAniversario;
	}
	/**
	 * Set da data de aniversario do contato.
	 * @param dataAniversario Nova data de aniversario do contato
	 */
	public void setDataAniversario(String dataAniversario) {
		this.dataAniversario = dataAniversario;
	}
	/**
	 * Set do nome do contato.
	 * @param nome Novo nome do contato
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}
	/**
	 * Get do endereco do contato.
	 * @return Endereco do contato
	 */
	public String getEndereco() {
		return endereco;
	}
	/**
	 * Set do endereco do contato.
	 * @param endereco Novo endereco do contato
	 */
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	/**
	 * Get da lista de formas de contato do contato.
	 * @return Lista de formas de contato do contato
	 */
	public List<FormaDeContato> getFormasDeContato(){
		return formasDeContato;
	}
	/**
	 * Adiciona nova forma de contato a lista de forma de contato de contato.
	 * @param formaDeContato Nova forma de contato a ser adicionada
	 */
	public void addFormaDeContato(FormaDeContato formaDeContato){
		formasDeContato.add(formaDeContato);
	}
	/**
	 * Remove uma forma de contato do contato.
	 * @param formaDeContato Forma de contato a ser removida
	 */
	public void removeFormaDeContato(FormaDeContato formaDeContato) {
		formasDeContato.remove(formaDeContato);
	}
	/**
	 * Get das formas de contato do contato, em formato de String.
	 * @return Formas de contato do contato em formato de String.
	 */
	@SuppressWarnings("unused")
	private String getFormasDeContatoToString() {
		String retorno = "";
		for(FormaDeContato f : getFormasDeContato())
			retorno = retorno + "\t" + f.toString() + "\n";
		
		return retorno;
	}
	/**
	 * toString da classe Contato
	 * @return String contendo os dados do contato
	 */
	public String toString() {
		return getNome(); 
	}

	/**
	 * @return Uma representacao em String detalhada do Contato
	 */
	public String toStringDetalhado() {
		return "Nome: " + nome + 
		", Data de aniversario: " + dataAniversario + 
		", Endereco: " + endereco;
	}
	
	/**
	 * Compara este contato lexicograficamente com outro
	 * @param outro Outro contato
	 * @return <0 se vem antes lexicograficamente, >0 se depois, 0 se for igual 
	 */
	@Override
	public int compareTo(Contato outro) {
		return nome.compareTo(outro.getNome());
	}
}
